<?php
/**
 * 消息通知控制器
 * 实现现代化的RESTful API用于消息通知功能
 */

declare (strict_types = 1);

namespace app\controller\oa;

use app\BaseController;
use app\common\DataPermissionHelper;
use think\facade\Db;
use think\facade\Request;
use think\response\Json;

class Message extends BaseController
{
    /**
     * 获取消息列表
     * @return Json
     */
    public function index(): Json
    {
        try {
            $params = Request::param();
            $page = (int)($params['page'] ?? 1);
            $limit = (int)($params['limit'] ?? 10);
            $userId = $this->getUserId();

            // 构建查询条件
            $where = [];
            $where[] = ['m.delete_time', '=', 0];
            
            // 消息类型筛选
            if (!empty($params['type'])) {
                if ($params['type'] == 'system') {
                    $where[] = ['m.from_uid', '=', 0];
                } elseif ($params['type'] == 'private') {
                    $where[] = ['m.from_uid', '>', 0];
                }
            }
            
            // 星标消息筛选
            if (isset($params['is_star']) && $params['is_star'] !== '') {
                $where[] = ['m.is_star', '=', (int)$params['is_star']];
            }
            
            // 已读状态筛选
            if (isset($params['read_status']) && $params['read_status'] !== '') {
                if ($params['read_status'] == 1) {
                    $where[] = ['m.read_time', '=', 0];
                } else {
                    $where[] = ['m.read_time', '>', 0];
                }
            }
            
            // 关键词搜索
            if (!empty($params['keywords'])) {
                $where[] = ['m.title', 'like', '%' . trim($params['keywords']) . '%'];
            }
            
            // 时间范围筛选
            if (!empty($params['date_range'])) {
                $dateRange = explode('~', $params['date_range']);
                $where[] = ['m.create_time', 'between', [strtotime(urldecode($dateRange[0])), strtotime(urldecode($dateRange[1].' 23:59:59'))]];
            }

            // 查询消息列表
            $list = Db::name('msg')
                ->alias('m')
                ->field('m.*, a.name as from_name')
                ->join('admin a', 'm.from_uid = a.id', 'LEFT')
                ->where($where)
                ->where('m.to_uid', $userId)
                ->page($page, $limit)
                ->order('m.id', 'desc')
                ->select()
                ->each(function ($item) {
                    $item['create_time'] = date('Y-m-d H:i', $item['create_time']);
                    $item['read_time'] = $item['read_time'] ? date('Y-m-d H:i', $item['read_time']) : '';
                    $item['from_name'] = $item['from_name'] ?? '系统';
                    return $item;
                });

            // 查询总数
            $total = Db::name('msg')
                ->alias('m')
                ->join('admin a', 'm.from_uid = a.id', 'LEFT')
                ->where($where)
                ->where('m.to_uid', $userId)
                ->count();

            return $this->paginate($list->toArray(), $total, $page, $limit, '获取消息列表成功');
        } catch (\Exception $e) {
            return $this->error('获取消息列表失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 查看消息详情
     * @return Json
     */
    public function read(): Json
    {
        try {
            $params = Request::param();
            $id = (int)($params['id'] ?? 0);
            $userId = $this->getUserId();

            if ($id <= 0) {
                return $this->paramError('消息ID不能为空');
            }

            // 查询消息详情
            $message = Db::name('msg')
                ->alias('m')
                ->field('m.*, a.name as from_name')
                ->join('admin a', 'm.from_uid = a.id', 'LEFT')
                ->where(['m.id' => $id, 'm.to_uid' => $userId, 'm.delete_time' => 0])
                ->find();

            if (!$message) {
                return $this->error('消息不存在或无权限查看', 404);
            }

            // 格式化时间
            $message['create_time'] = date('Y-m-d H:i', $message['create_time']);
            $message['read_time'] = $message['read_time'] ? date('Y-m-d H:i', $message['read_time']) : '';
            $message['from_name'] = $message['from_name'] ?? '系统';

            // 获取附件信息
            if (!empty($message['file_ids'])) {
                $message['file_array'] = Db::name('file')->where([['id', 'in', $message['file_ids']]])->select()->toArray();
            }

            // 标记为已读
            if ($message['read_time'] == '') {
                Db::name('msg')
                    ->where('id', $id)
                    ->update([
                        'read_time' => time(),
                        'update_time' => time()
                    ]);
            }

            return $this->success($message, '获取消息详情成功');
        } catch (\Exception $e) {
            return $this->error('获取消息详情失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 发送消息
     * @return Json
     */
    public function save(): Json
    {
        try {
            $params = Request::param();
            $userId = $this->getUserId();

            // 数据验证
            if (empty($params['title'])) {
                return $this->paramError('消息主题不能为空');
            }

            if (empty($params['content'])) {
                return $this->paramError('消息内容不能为空');
            }

            // 接收人类型判断
            if (empty($params['types'])) {
                return $this->paramError('请选择接收人类型');
            }

            if ($params['types'] == 1 && empty($params['uids'])) {
                return $this->paramError('请选择接收人员');
            }

            if ($params['types'] == 2 && empty($params['dids'])) {
                return $this->paramError('请选择接收部门');
            }

            if ($params['types'] == 3 && empty($params['pids'])) {
                return $this->paramError('请选择接收岗位');
            }

            // 开始事务
            Db::startTrans();
            try {
                // 创建主消息记录
                $messageData = [
                    'title' => $params['title'],
                    'content' => $params['content'],
                    'template' => $params['template'] ?? '',
                    'file_ids' => $params['file_ids'] ?? '',
                    'from_uid' => $userId,
                    'types' => $params['types'],
                    'uids' => $params['uids'] ?? '',
                    'dids' => $params['dids'] ?? '',
                    'pids' => $params['pids'] ?? '',
                    'copy_uids' => $params['copy_uids'] ?? '',
                    'is_draft' => 1, // 已发送
                    'send_time' => time(),
                    'create_time' => time(),
                    'update_time' => time()
                ];

                $messageId = Db::name('message')->insertGetId($messageData);

                // 查询接收人
                $users = [];
                if ($params['types'] == 1) { // 人员
                    $users = Db::name('admin')->where('status', 1)->where('id', 'in', $params['uids'])->column('id');
                } elseif ($params['types'] == 2) { // 部门
                    $users = Db::name('admin')->where('status', 1)->where('did', 'in', $params['dids'])->column('id');
                } elseif ($params['types'] == 3) { // 岗位
                    $users = Db::name('admin')->where('status', 1)->where('position_id', 'in', $params['pids'])->column('id');
                } elseif ($params['types'] == 4) { // 全部
                    $users = Db::name('admin')->where('status', 1)->column('id');
                }

                // 添加抄送人
                if (!empty($params['copy_uids'])) {
                    $copyUids = explode(',', $params['copy_uids']);
                    $users = array_merge($users, $copyUids);
                    $users = array_unique($users);
                }

                // 组合要发送的消息
                $sendData = [];
                foreach ($users as $toUid) {
                    if ($toUid == $userId) {
                        continue; // 不发送给自己
                    }
                    $sendData[] = [
                        'message_id' => $messageId,
                        'to_uid' => $toUid,
                        'msg_id' => $params['msg_id'] ?? 0,
                        'title' => $params['title'],
                        'content' => $params['content'],
                        'file_ids' => $params['file_ids'] ?? '',
                        'from_uid' => $userId,
                        'create_time' => time(),
                        'update_time' => time()
                    ];
                }

                // 批量插入接收消息
                if (!empty($sendData)) {
                    Db::name('msg')->insertAll($sendData);
                }

                Db::commit();

                return $this->created(['id' => $messageId], '发送消息成功');
            } catch (\Exception $e) {
                Db::rollback();
                throw $e;
            }
        } catch (\Exception $e) {
            return $this->error('发送消息失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 删除消息（软删除）
     * @return Json
     */
    public function delete(): Json
    {
        try {
            $params = Request::param();
            $id = (int)($params['id'] ?? 0);
            $userId = $this->getUserId();

            if ($id <= 0) {
                return $this->paramError('消息ID不能为空');
            }

            // 检查消息是否存在且属于当前用户
            $message = Db::name('msg')
                ->where('id', $id)
                ->where('to_uid', $userId)
                ->find();

            if (!$message) {
                return $this->error('消息不存在或无权限删除', 404);
            }

            $result = Db::name('msg')
                ->where('id', $id)
                ->update([
                    'delete_time' => time(),
                    'update_time' => time()
                ]);

            if ($result) {
                return $this->deleted('删除消息成功');
            } else {
                return $this->error('删除消息失败', 500);
            }
        } catch (\Exception $e) {
            return $this->error('删除消息失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 设置星标消息
     * @return Json
     */
    public function star(): Json
    {
        try {
            $params = Request::param();
            $id = (int)($params['id'] ?? 0);
            $userId = $this->getUserId();

            if ($id <= 0) {
                return $this->paramError('消息ID不能为空');
            }

            // 检查消息是否存在且属于当前用户
            $message = Db::name('msg')
                ->where('id', $id)
                ->where('to_uid', $userId)
                ->find();

            if (!$message) {
                return $this->error('消息不存在', 404);
            }

            $result = Db::name('msg')
                ->where('id', $id)
                ->update([
                    'is_star' => 1,
                    'update_time' => time()
                ]);

            if ($result) {
                return $this->success('设置星标成功');
            } else {
                return $this->error('设置星标失败', 500);
            }
        } catch (\Exception $e) {
            return $this->error('设置星标失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 取消星标消息
     * @return Json
     */
    public function unstar(): Json
    {
        try {
            $params = Request::param();
            $id = (int)($params['id'] ?? 0);
            $userId = $this->getUserId();

            if ($id <= 0) {
                return $this->paramError('消息ID不能为空');
            }

            // 检查消息是否存在且属于当前用户
            $message = Db::name('msg')
                ->where('id', $id)
                ->where('to_uid', $userId)
                ->find();

            if (!$message) {
                return $this->error('消息不存在', 404);
            }

            $result = Db::name('msg')
                ->where('id', $id)
                ->update([
                    'is_star' => 0,
                    'update_time' => time()
                ]);

            if ($result) {
                return $this->success('取消星标成功');
            } else {
                return $this->error('取消星标失败', 500);
            }
        } catch (\Exception $e) {
            return $this->error('取消星标失败: ' . $e->getMessage(), 500);
        }
    }

    /**
     * 获取未读消息数量
     * @return Json
     */
    public function unreadCount(): Json
    {
        try {
            $userId = $this->getUserId();

            $count = Db::name('msg')
                ->where('to_uid', $userId)
                ->where('read_time', 0)
                ->where('delete_time', 0)
                ->count();

            return $this->success(['count' => $count], '获取未读消息数量成功');
        } catch (\Exception $e) {
            return $this->error('获取未读消息数量失败: ' . $e->getMessage(), 500);
        }
    }

    // === 向后兼容方法 ===

    /**
     * 向后兼容：获取消息列表
     */
    public function list()
    {
        return $this->index();
    }

    /**
     * 向后兼容：查看消息详情
     */
    public function view()
    {
        return $this->read();
    }

    /**
     * 向后兼容：发送消息
     */
    public function add()
    {
        return $this->save();
    }

    /**
     * 向后兼容：发送消息
     */
    public function edit()
    {
        return $this->save();
    }

    /**
     * 向后兼容：删除消息
     */
    public function del()
    {
        return $this->delete();
    }
}